//自己
class Solution {
public:
    string modifyString(string s) {
        //1.遍历
        int len = s.size();
        for (int i=0; i<len; i++)
        {
            //2.找?
            if (s[i] == '?')
            {
                //3.赋值+判断
                for (char ch = 'a'; ch<='z'; ch++)
                {
                    s[i] = ch;
                    if ((i-1 < 0) && s[i]!=s[i+1])//第一个;  即使附近有?也不影响
                        break;
                    else if ((i+1 > len-1) && s[i]!=s[i-1])//最后一个
                        break;
                    //可能会存在在第一/最后, 与后前相等的, 进入下面判断, 因越界而出错
                    //else if ((s[i]!=s[i-1]) && (s[i]!=s[i+1]))
                    //(i-1 >=0 || i+1<=len-1)这存在逻辑错误, 应该是&&
                    else if ((i-1 >=0 && i+1<=len-1) && (s[i]!=s[i-1]) && (s[i]!=s[i+1]))//避免边界; 
                        break;
                }
            }
        }
        return s;
    }
};
//时间 O(N^2)

//答案
class Solution {
public:
    string modifyString(string s) {
        //1.遍历
        int len = s.size();
        for (int i=0; i<len; i++)
        {
            //2.找?
            if (s[i] == '?')
            {
                //3.赋值+判断
                for (char ch = 'a'; ch<='z'; ch++)
                {
                    //下面这句逻辑上非常巧妙, 相当于 
                    //i==0时, 与右数判断
                    //i==n-1时, 与左数判断
                    //i在中间时, 与左右判断
                    //如果ch与附近不同, 就赋值, 跳出
                    if ((i==0 || ch!=s[i-1]) && (i==len-1 || ch!=s[i+1]))
                    {
                        s[i] = ch;
                        break;
                    }
                }
            }
        }
        return s;
    }
};
//时间 O(N^2)